<?php
function __unserialize($sObject) {

    $__ret =preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $sObject );

    return unserialize($__ret);

}

/**
 * Класс предназначен для работы с сессиями
 *
 */
class User_Flash {
  static $arResult = array();
  static $isArrLoaded = false;

	/**
   * Конструктор. Переопределяет ф-ции для работы с сессией
   *
   */
  private function __construct() {
  }

  /**
   * Запись значения переменной $nm, относящееся к текущей сессии
   *
   * @param string $nm - Имя параметра
   * @param string $val - Значение параметра
   */
  public static function _set($nm, $val, $saveHtml = false) {
    $objDB = Service_Database::instance();
    if (!$saveHtml) $strSer = serialize(Service_Function::absolutelyEscapeString($val));//Сериализуем значение
    else $strSer = serialize(Service_Function::absolutelyEscapeStringSavingHtml($val));//Сериализуем значение
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $stmt = "SELECT `ID_user_session` FROM `flash` WHERE `ID_user_session` = '" . $sessionId . "' AND `variable_name` = '" . $nm . "'";
    if ($objDB->isRecordExist($stmt)) {
      $stmt = "UPDATE `flash` SET `variable_value` = '" . $strSer . "' WHERE `ID_user_session` = '" . $sessionId . "' AND `variable_name` = '" . $nm . "'";
    }
    else{
      //Вставляем значение в БД для текущей сессии, данного названия переменной $nm
      $stmt = "INSERT INTO `flash` (`ID_user_session`,`variable_name`,`variable_value`) VALUES (" . $sessionId . ",'" . $nm . "','" . $strSer . "')";
    }
    $objDB->query($stmt);
  }

  /**
   * Удаление значения параметра из сессии
   *
   * @param string $nm - Имя параметра
   */
  public static function __delete($nm) {
    $objDB = Service_Database::instance();
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $stmt = "DELETE FROM `flash` WHERE ID_user_session = " . $sessionId . " AND variable_name='" . $nm . "'";
    $objDB->query($stmt);
  }

  /**
   * Удаление значения параметра из сессии
   *
   * @param string $nm - Имя параметра
   */
  public static function __deleteAllFromUser() {
    $objDB = Service_Database::instance();
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $stmt = "DELETE FROM `flash` WHERE ID_user_session = " . $sessionId;
    $objDB->query($stmt);
  }

  /**
   * Функция берет переменую из сессии по имени
   *
   * @param string $nm - Имя параметра
   * @return string - Значение параметра
   */
  public static function _get($nm) {
  	if (self::$isArrLoaded)
    	if (isset(self::$arResult[$nm]))
    	  return self::$arResult[$nm];
    	else return null;
    self::__getArray();
  	return self::_get($nm);
    	/*$objDB = Service_Database::instance();
    //Получаем значение переменной $nm, относящееся к текущей сессии
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $arResult = $objDB->select("SELECT `variable_value` FROM `flash` WHERE `ID_user_session` = " . $sessionId . " AND `variable_name` = '" . $nm . "'");
    if (sizeof($arResult)>0) { // Если  есть элементы
      return(unserialize($arResult[sizeof($arResult)-1]["variable_value"]));//возвращаем значение
    }
    else { // Если нет элементов
      return false;
    }*/
  }

  /**
     * Функция записи массива значений массива переменных, относящихся к текущей сессии
     *
     * @param array $name - массив переменных
     */
    public static function __setArray($name) {
      $objDB = Service_Database::instance();
      $objSession = User_Session::instance();
    	$sessionId = $objSession->getUserSessionId();
      	foreach ($name as $key => $value) {
      		$strSer = serialize($value); # Сериализуем значение
      		$stmt = "INSERT INTO `flash` (`ID_user_session`,`variable_name`,`variable_value`) VALUES (" . $sessionId . ",'" . $key . "','" . $strSer . "')";
      		$objDB->query($stmt);

      	}
     }

 	 /**
 	  * Получение массва значений переменных
 	  *
 	  * @return false/массив значений переменных
 	  */
     public static function __getArray($loadNew = false) {
      if (self::$isArrLoaded && !$loadNew)
      	return $arResult;
     	self::$isArrLoaded = true;
     	$objDB = Service_Database::instance();
      $objSession = User_Session::instance();
    	$sessionId = $objSession->getUserSessionId();
      $arr = $objDB->select("SELECT variable_value, variable_name FROM `flash` WHERE ID_user_session = " . $sessionId);
      for($i = 0; $i < sizeof($arr); $i++) {
      	self::$arResult[$arr[$i]['variable_name']] = $arr[$i]['variable_value'];
      	if (sizeof(self::$arResult[$arr[$i]['variable_name']])>0) # Если  есть элементы
        	self::$arResult[$arr[$i]['variable_name']] = unserialize($arr[$i]["variable_value"]); # возвращаем значение # [sizeof($arResult)]
      }
      if (sizeof(self::$arResult)>0) {
      	self::__deleteArray();
      	return self::$arResult;
      }
      else # Если нет элементов
        return(false);
 	}

 	/**
 	 * метод добавляет переменную к массиву флэша или перезаписывает ее
 	 *
 	 * @param string $nm
 	 * @param mixed $value
 	 */
 	public static function __addToLoadedArray($nm, $value) {
 		self::__getArray();
 		self::$arResult[$nm] = $value;
 	}

 	/**
 	 * Функция удаления записей значений массива переменных
 	 *
 	 */
 	public static function __deleteStr() {
 		$objDB = Service_Database::instance();
 		$func_list = func_get_args();
 		for($i = 0; $i < sizeof($func_list); $i++)
		{
			$stmt = 'DELETE FROM `flash`
    		WHERE `variable_name` = "' . $func_list[$i] . '"';
			$objDB->query($stmt);
		}
	}
 	/**
 	 * Функция удаления записей флэша
 	 *
 	 */
 	public static function __deleteArray() {
    $objSession = User_Session::instance();
  	$sessionId = $objSession->getUserSessionId();
 		$objDB = Service_Database::instance();
		$stmt = "DELETE FROM `flash`
  		WHERE ID_user_session = " . $sessionId;
		$objDB->query($stmt);
	}

	/**
	 * Удаляет ишние переменные сессий
	 *
	 */
	public static function _deleteBadVariables() {
		$objDB = Service_Database::instance();
		$stmt = "SELECT `ID_flash` FROM `flash`
						LEFT JOIN `session` ON `session`.`ID_user_session` = `flash`.`ID_user_session`
    				WHERE `session`.`last_impression` < DATE_SUB(now(), INTERVAL 14 MINUTE) OR `session`.`last_impression` IS NULL";
		$arrIds = $objDB->selectSimpleArray($stmt);
		if (!$arrIds)
		  return false;
		$stmt = "DELETE FROM `flash`
    				WHERE `ID_session_variable` IN(" . implode(',', $arrIds) . ")";
		$objDB->query($stmt);
		return true;
	}

}
?>